package ipower.studentworks.dao.impl;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import ipower.studentworks.dao.Dao;
/**
 * 数据操作实现类。
 * @author young。
 * @since 2013-01-12。
 * */
public class DaoImpl<T> implements Dao<T> {
	private SessionFactory sessionFactory;
	/**
	 * 设置SessionFactory。
	 * @param sessionFactory
	 * 	Hibernate Session 对象。
	 * */
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	/**
	 * 获取当前会话。
	 * @return 当前会话。
	 * */
	private Session getCurrentSession(){
		return this.sessionFactory == null ? null : this.sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	@Override
	public T load(Class<T> c, Serializable id) {
		if(c != null && id != null){
			return (T)this.getCurrentSession().get(c, id);
		}
		return null;
	}

	@Override
	public Serializable save(T data) {
		if(data != null){
			return this.getCurrentSession().save(data);
		}
		return null;
	}

	@Override
	public void update(T data) {
		if(data != null){
			this.getCurrentSession().update(data);
		}
	}

	@Override
	public void saveOrUpdate(T data) {
		if(data != null) this.getCurrentSession().saveOrUpdate(data);
	}

	@Override
	public void delete(T data) {
		if(data != null){
			this.getCurrentSession().delete(data);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> find(String hql, Map<String, Object> parameters,Integer page, Integer rows) {
		if(hql == null || hql.isEmpty()) return null;
		Query query = this.getCurrentSession().createQuery(hql);
		if(query != null){
			if(parameters != null && parameters.size() > 0){
				for(String key : parameters.keySet()){
					query.setParameter(key, parameters.get(key));
				}
			}
			if((page == null) && (rows == null)) 
				return query.list();
			if((page == null) || (page < 1)) page = 1;
			if((rows == null) || (rows < 10)) rows = 10;
			return query.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
		}
		return null;
	}

	@Override
	public Long count(String hql, Map<String, Object> parameters) {
		if(hql == null || hql.isEmpty()) return null;
		Query query = this.getCurrentSession().createQuery(hql);
		if(query != null){
			if(parameters != null && parameters.size() > 0){
				for(String key : parameters.keySet()){
					query.setParameter(key, parameters.get(key));
				}
			}
			return (Long)query.uniqueResult();
		}
		return null;
	}
}